const Koa = require("koa")
const app = new Koa()

/* 保证洋葱模型
    1. 所有的中间件函数都要定义为async函数
    2. 所有的next都要await
    3. 使用的异步逻辑都要封装为promise 并且要await

    一个中间件函数中的next只能调一次
*/

//dispatch(0)
app.use(async (ctx,next) =>{
    console.log(1)
    //后台种cookie
    ctx.cookies.set("test",Date.now())
    ctx.body = "1"
    await next()  //dispatch(1)返回的promise 与 第二个中间件函数返回的promise保持一致
    console.log(6)
})

app.use(async (ctx,next) =>{
    //后台读cookie
    console.log(2,ctx.cookies.get("test"))
    ctx.body += "2"
    await next() //dispatch(2)
    await new Promise((resolve, reject)=>{
        setTimeout(()=>{
            console.log(5);
            resolve()
        },3000)
    })
})

app.use(async (ctx,next) =>{
    console.log(3)

    //扩展koa的api start
    ctx.damuFn();
    console.log(ctx.zdy);
    //扩展koa的api end

    ctx.body += "3"
    await next() //dispatch(3) ==> Promise.resolve()
    console.log(4)
})

app.listen(3001,"127.0.0.1",()=>{
    console.log("server is running on http://127.0.0.1:3001")
})
